package com.bl.basic.service.impl;

import com.bl.basic.constant.RegisterConstant;
import com.bl.basic.exception.BusinessException;
import com.bl.basic.service.IVerifyCodeService;
import com.bl.basic.util.JsonResult;
import com.bl.basic.util.SmsUtil;
import com.bl.basic.util.StrUtils;
import com.bl.basic.util.VerifyCodeUtils;
import com.bl.user.domain.User;
import com.bl.user.mapper.UserMapper;
import com.bl.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

   @Autowired
   private RedisTemplate redisTemplate;

   @Autowired
   private UserMapper userMapper;



    /**
     *  获取base64位字符串图形验证码
     * @param key
     * @return
     */
    @Override
    public String getVerifyCode(String key) {
        // 校验空值
        if (StringUtils.isEmpty(key)){
            throw new BusinessException("参数异常");
        }
        // 获取随机验证码
        String code = StrUtils.getComplexRandomString(4);

        // 放到reais 设置过期时间
        redisTemplate.opsForValue().set(key,code,3, TimeUnit.MINUTES);

        // 转换成图片的base64位 的字符串 并且返回
        return  VerifyCodeUtils.verifyCode(100,40,code);

    }

    /**
     * 获取手机验证码
     * @param map
     */
    @Override
    public void getSmsCode(Map<String, String> map) {
        String phone = map.get("phone");
        String imageCode = map.get("imageCode");
        String imageCodeKey = map.get("imageCodeKey");
        // 校验空值
        if (StringUtils.isEmpty(phone)) {
            throw new BusinessException("电话号码不能为空");
        }
        if (StringUtils.isEmpty(imageCode)) {
            throw new BusinessException("图形验证码不能为空");
        }
        if (StringUtils.isEmpty(imageCodeKey)) {
            throw new BusinessException("图形验证码过期，请重新获取");
        }
        // 校验图形验证码，是否过期
        Object imgCodeK = redisTemplate.opsForValue().get(imageCodeKey);
        if (imgCodeK == null) {
            throw new BusinessException("图形验证码过期，请重新获取");
        }
        // 判断输入的图形验证码是否正确
        if (!imgCodeK.toString().equalsIgnoreCase(imageCode)) {
            throw new BusinessException("图形验证码错误，请重新获取");
        }
        // 校验手机号是否注册
        User user = userMapper.loadByPhone(phone);
        if (user != null) {
            throw new BusinessException("电话号码已注册，请直接登录！！！！");
        }
        // 获取redis中的数据
        Object value = redisTemplate.opsForValue().get(phone + RegisterConstant.PHONEREGISTER);
        // 如果取不到，没有发送过，获取过期了， 直接生成一个新的验证码保存到redis
        String code = null;
        if (value == null) {
            // 创建新的code
            code = StrUtils.getComplexRandomString(6);
        } else {
            // 取到值就判断是否超过1分钟
            String redisTime = value.toString().split(":")[1];
            Long time = Long.valueOf(redisTime);
            //如果没超过1分钟，直接提示用户，1分钟之内不能多次发送。
            if (System.currentTimeMillis() - time < 1 * 60 * 1000) {
                throw new BusinessException("一分钟内不能发送多次！");
            } else {
                //  如果超过了一分钟，刷新过期时间，
                code = value.toString().split(":")[0];
            }
        }
        // 把生成的code存入redis中，并设置过期时间为3分钟
        redisTemplate.opsForValue().set(phone + RegisterConstant.PHONEREGISTER,
                code + ":" + System.currentTimeMillis(),
                3, TimeUnit.MINUTES);//设置3分钟有效

        // 发送短信给用户
        // SmsUtil.sendSms(phone,"你的验证码为 ：" + code + ",三分钟有效");
        System.out.println("你的验证码为 ：" + code + ",三分钟有效");
    }
    /**
     * 微信扫码登录用户绑定手机号
     * @param map
     */
    @Override
    public void binderSmsCode(Map<String, String> map) {

        String phone = map.get("phone");
        // 校验空值
        if (StringUtils.isEmpty(phone)) {
            throw new BusinessException("电话号码不能为空");
        }
        // 获取redis中的数据
        Object value = redisTemplate.opsForValue().get(phone + RegisterConstant.WXBINDER);
        // 如果取不到，没有发送过，获取过期了， 直接生成一个新的验证码保存到redis
        String code = null;
        if (value == null) {
            // 创建新的code
            code = StrUtils.getComplexRandomString(6);
        } else {
            // 取到值就判断是否超过1分钟
            String redisTime = value.toString().split(":")[1];
            Long time = Long.valueOf(redisTime);
            //如果没超过1分钟，直接提示用户，1分钟之内不能多次发送。
            if (System.currentTimeMillis() - time < 1 * 60 * 1000) {
                throw new BusinessException("一分钟内不能发送多次！");
            } else {
                //  如果超过了一分钟，刷新过期时间，
                code = value.toString().split(":")[0];
            }
        }
        // 把生成的code存入redis中，并设置过期时间为3分钟
        redisTemplate.opsForValue().set(phone + RegisterConstant.WXBINDER,
                code + ":" + System.currentTimeMillis(),
                3, TimeUnit.MINUTES);//设置3分钟有效

        // 发送短信给用户
        // SmsUtil.sendSms(phone,"你的验证码为 ：" + code + ",三分钟有效");
        System.out.println("你的验证码为 ：" + code + ",三分钟有效");


    }
}